<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 高阶函数：有函数作为输入或者输出的函数都被称为高阶函数。
      // 1. 回调函数：把函数作为参数传递给另一个函数
      //   let fn = function () {
      //     console.log("fn1");
      //   };

      //   function myfn(fn) {
      //     fn();
      //   }

      //   myfn(fn);

      // 2. 把函数作为输出返还出来的函数；
      //  bind()() call apply
      //   function curry() {
      //     return function (a) {
      //       return function (b) {
      //         return function (c) {
      //           return a + b + c;
      //         };
      //       };
      //     };
      //   }

      //   let res = curry()(1)(2)(3);
      //   console.log(res);

      function add(a, b, c) {
        // 多元函数
        return a + b + c;
      }

      //   console.log(add.length);  // 函数的长度是参数的个数

      // 如何把上述函数变成一元调用，过程叫 柯里化：把多元调用转成一元调用的过程
      function curryFn(add) {
        return function (a) {
          return function (b) {
            return function (c) {
              return add(a, b, c);
            };
          };
        };
      }

      let myadd = curryFn(add);
      //   console.log(add);
      //   console.log(myadd);
      console.log(myadd(1)(2)(3)); // 把add的多元调用变成了一元调用形式
    </script>
  </body>
</html>
